<!DOCTYPE html>
<html>

<head>
  <title>Getting Started with gRPC</title>
  <script id="adobe_dtm" src="https://www.redhat.com/dtm.js" type="text/javascript"></script>
  <script src="/assets/javascript/highlight.pack.js" type="text/javascript"></script>
  <META HTTP-EQUIV='Content-Security-Policy' CONTENT="default-src 'none'; script-src 'self' 'unsafe-eval' 'sha256-ANpuoVzuSex6VhqpYgsG25OHWVA1I+F6aGU04LoI+5s=' 'sha256-ipy9P/3rZZW06mTLAR0EnXvxSNcnfSDPLDuh3kzbB1w=' js.bizographics.com https://www.redhat.com assets.adobedtm.com jsonip.com https://ajax.googleapis.com https://www.googletagmanager.com https://www.google-analytics.com https://use.fontawesome.com; style-src 'self' https://fonts.googleapis.com https://use.fontawesome.com; img-src 'self' *; media-src 'self' ; frame-src https://www.googletagmanager.com https://www.youtube.com; frame-ancestors 'none'; base-uri 'none'; object-src 'none'; form-action 'none'; font-src 'self' https://use.fontawesome.com https://fonts.gstatic.com;">
  <META HTTP-EQUIV='X-Frame-Options' CONTENT="DENY">
  <META HTTP-EQUIV='X-XSS-Protection' CONTENT="1; mode=block">
  <META HTTP-EQUIV='X-Content-Type-Options' CONTENT="nosniff">
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="description" content="Quarkus: Supersonic Subatomic Java">
  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:site" content="@QuarkusIO"> 
  <meta name="twitter:creator" content="@QuarkusIO">
  <meta property="og:url" content="https://quarkus.io/guides/grpc-getting-started" />
  <meta property="og:title" content="Getting Started with gRPC" />
  <meta property="og:description" content="Quarkus: Supersonic Subatomic Java" />
  <meta property="og:image" content="/assets/images/quarkus_card.png" />
  <link rel="canonical" href="https://quarkus.io/guides/grpc-getting-started">
  <link rel="shortcut icon" type="image/png" href="/favicon.ico" >
  <link rel="stylesheet" href="https://quarkus.io/guides/stylesheet/config.css" />
  <link rel="stylesheet" href="/assets/css/main.css" />
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
  <link rel="alternate" type="application/rss+xml"  href="https://quarkus.io/feed.xml" title="Quarkus">
  <script src="https://quarkus.io/assets/javascript/goan.js" type="text/javascript"></script>
  <script src="https://quarkus.io/assets/javascript/hl.js" type="text/javascript"></script>
</head>

<body class="guides">
  <!-- Google Tag Manager (noscript) -->
  <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NJWS5L"
  height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  <!-- End Google Tag Manager (noscript) -->

  <div class="nav-wrapper">
  <div class="grid-wrapper">
    <div class="width-12-12">
      <input type="checkbox" id="checkbox" />
      <nav id="main-nav" class="main-nav">
  <div class="container">
    <div class="logo-wrapper">
      
        <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_600px_reverse.png" class="project-logo" title="Quarkus"></a>
      
    </div>
    <label class="nav-toggle" for="checkbox">
      <i class="fa fa-bars"></i>
    </label>
    <div id="menu" class="menu">
      <span>
        <a href="/get-started/" class="">Get Started</a>
      </span>
      <span>
        <a href="/guides/" class="active">Guides</a>
      </span>
      <span>
        <a href="/community/" class="">Community</a>
      </span>
      <span>
        <a href="/support/" class="">Support</a>
      </span>
      <span>
        <a href="/blog/" class="">Blog</a>
      </span>
      <span>
        <a href="https://code.quarkus.io" class="button-cta secondary white">Start Coding</a>
      </span>
    </div>
  </div>
      </nav>
    </div>
  </div>
</div>

  <div class="content">
    <div class="guide">
  <div class="width-12-12">
    <h1 class="text-caps">Getting Started with gRPC</h1>
    <div class="hide-mobile toc"><ul class="sectlevel1">
<li><a href="#configuring-your-project">Configuring your project</a></li>
<li><a href="#implementing-a-grpc-service">Implementing a gRPC service</a>
<ul class="sectlevel2">
<li><a href="#implementing-a-service">Implementing a service</a></li>
<li><a href="#the-grpc-server">The gRPC server</a></li>
</ul>
</li>
<li><a href="#consuming-a-grpc-service">Consuming a gRPC service</a></li>
<li><a href="#packaging-the-application">Packaging the application</a></li>
<li><a href="#generating-java-files-from-proto-with-protobuf-maven-plugin">Generating Java files from proto with protobuf-maven-plugin</a></li>
</ul></div>
    <div>
      <div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>This page explains how to start using gRPC in your Quarkus application.
While this page describes how to configure it with Maven, it is also possible to use Gradle.</p>
</div>
<div class="paragraph">
<p>Let&#8217;s imagine you have a regular Quarkus project, generated from the <a href="https://code.quarkus.io">Quarkus project generator</a>.
The default configuration is enough, but you can also select some extensions if you want.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="configuring-your-project"><a class="anchor" href="#configuring-your-project"></a>Configuring your project</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Edit the <code>pom.xml</code> file to add the Quarkus gRPC extension dependency (just under <code>&lt;dependencies&gt;</code>):</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="xml" class="language-xml hljs">&lt;dependency&gt;
  &lt;groupId&gt;io.quarkus&lt;/groupId&gt;
  &lt;artifactId&gt;quarkus-grpc&lt;/artifactId&gt;
&lt;/dependency&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>Make sure you have <code>prepare</code> goal of <code>quarkus-maven-plugin</code> enabled in your <code>pom.xml</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="xml" class="language-xml hljs">&lt;build&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;io.quarkus&lt;/groupId&gt;
            &lt;artifactId&gt;quarkus-maven-plugin&lt;/artifactId&gt;
            &lt;executions&gt;
                &lt;execution&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;prepare&lt;/goal&gt;
                        &lt;goal&gt;build&lt;/goal&gt;
                    &lt;/goals&gt;
                &lt;/execution&gt;
            &lt;/executions&gt;
        &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/build&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>With this configuration, you can put your service and message definitions in the <code>src/main/proto</code> directory.
<code>quarkus-maven-plugin</code> will generate Java files from your <code>proto</code> files.
Alternatively to using the <code>prepare</code> goal of the <code>quarkus-maven-plugin</code>, you can use <code>protobuf-maven-plugin</code> to generate these files, more in <a href="#generating-java-files-from-proto-with-protobuf-maven-plugin">Generating Java files from proto with protobuf-maven-plugin</a></p>
</div>
<div class="paragraph">
<p>Let&#8217;s start with a simple <em>Hello</em> service.
Create the <code>src/main/proto/helloworld.proto</code> file with the following content:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">syntax = "proto3";

option java_multiple_files = true;
option java_package = "io.quarkus.example";
option java_outer_classname = "HelloWorldProto";

package helloworld;

// The greeting service definition.
service Greeter {
    // Sends a greeting
    rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
    string name = 1;
}

// The response message containing the greetings
message HelloReply {
    string message = 1;
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>This <code>proto</code> file defines a simple service interface with a single method (<code>SayHello</code>), and the exchanged messages (<code>HelloRequest</code> containing the name and <code>HelloReply</code> containing the greeting message).</p>
</div>
<div class="paragraph">
<p>Before coding, we need to generate the classes used to implement and consume gRPC services.
In a terminal, run:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="bash" class="language-bash hljs">$ mvn compile</code></pre>
</div>
</div>
<div class="paragraph">
<p>Once generated, you can look at the <code>target/generated-sources/protobuf</code> directory:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="txt" class="language-txt hljs">target/generated-sources/protobuf
├── grpc-java
│   └── io
│       └── quarkus
│           └── example
│               └── GreeterGrpc.java
└── java
    └── io
        └── quarkus
            └── example
                ├── HelloReply.java
                ├── HelloReplyOrBuilder.java
                ├── HelloRequest.java
                ├── HelloRequestOrBuilder.java
                ├── HelloWorldProto.java
                └── MutinyGreeterGrpc.java</code></pre>
</div>
</div>
<div class="paragraph">
<p>These are the classes we are going to use.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<i class="fa icon-important" title="Important"></i>
</td>
<td class="content">
Every time you update the <code>proto</code> files, you need to re-generate the classes (using <code>mvn compile</code>).
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="implementing-a-grpc-service"><a class="anchor" href="#implementing-a-grpc-service"></a>Implementing a gRPC service</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Now that we have the generated classes let&#8217;s implement our <em>hello</em> service.</p>
</div>
<div class="paragraph">
<p>With Quarkus, implementing a service requires to <em>extend</em> the generated service base implementation and expose it as a <code>@Singleton</code> CDI bean.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<i class="fa icon-important" title="Important"></i>
</td>
<td class="content">
Don&#8217;t use <code>@ApplicationScoped</code> as the gRPC service implementation cannot be proxied.
</td>
</tr>
</table>
</div>
<div class="sect2">
<h3 id="implementing-a-service"><a class="anchor" href="#implementing-a-service"></a>Implementing a service</h3>
<div class="paragraph">
<p>Create the <code>src/main/java/org/acme/HelloService.java</code> file with the following content:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">package org.acme;

import io.grpc.stub.StreamObserver;
import io.quarkus.example.GreeterGrpc;
import io.quarkus.example.HelloReply;
import io.quarkus.example.HelloRequest;

import javax.inject.Singleton;

@Singleton                                                                                    <i class="conum" data-value="1"></i><b>(1)</b>
public class HelloService extends GreeterGrpc.GreeterImplBase {                               <i class="conum" data-value="2"></i><b>(2)</b>

    @Override
    public void sayHello(HelloRequest request, StreamObserver&lt;HelloReply&gt; responseObserver) { <i class="conum" data-value="3"></i><b>(3)</b>
        String name = request.getName();
        String message = "Hello " + name;
        responseObserver.onNext(HelloReply.newBuilder().setMessage(message).build());         <i class="conum" data-value="4"></i><b>(4)</b>
        responseObserver.onCompleted();                                                       <i class="conum" data-value="5"></i><b>(5)</b>
    }
}</code></pre>
</div>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Expose your implementation as bean</p>
</li>
<li>
<p>Extends the <code>ImplBase</code> class. This is a generated class.</p>
</li>
<li>
<p>Implement the methods defined in the service definition (here we have a single method)</p>
</li>
<li>
<p>Build and send the response</p>
</li>
<li>
<p>Close the response</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>Quarkus also provides an additional model with Mutiny, a Reactive Programming API integrated in Quarkus.
Learn more about Mutiny on the <a href="getting-started-reactive#mutiny">Getting Started with Reactive guide</a>.
A Mutiny implementation of this service would be:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">package org.acme;

import io.quarkus.example.HelloReply;
import io.quarkus.example.HelloRequest;
import io.quarkus.example.MutinyGreeterGrpc;
import io.smallrye.mutiny.Uni;

import javax.inject.Singleton;

@Singleton
public class ReactiveHelloService extends MutinyGreeterGrpc.GreeterImplBase {

    @Override
    public Uni&lt;HelloReply&gt; sayHello(HelloRequest request) {
        return Uni.createFrom().item(() -&gt;
                HelloReply.newBuilder().setMessage("Hello " + request.getName()).build()
        );
    }
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>The main differences are the following:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>it extends the <code>ImplBase</code> from <code>MutinyGreeterGrpc</code> instead of <code>GreeterGrpc</code></p>
</li>
<li>
<p>the signature of the method is using Mutiny types</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="the-grpc-server"><a class="anchor" href="#the-grpc-server"></a>The gRPC server</h3>
<div class="paragraph">
<p>The services are <em>served</em> by a <em>server</em>.
Available services (<em>CDI beans</em>) are automatically registered and exposed.</p>
</div>
<div class="paragraph">
<p>By default, the server is exposed on <code>localhost:9000</code>, and uses <em>plain-text</em> (so no TLS).</p>
</div>
<div class="paragraph">
<p>Run the application using: <code>mvn quarkus:dev</code>.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="consuming-a-grpc-service"><a class="anchor" href="#consuming-a-grpc-service"></a>Consuming a gRPC service</h2>
<div class="sectionbody">
<div class="paragraph">
<p>In this section, we are going to consume the service we expose.
To simplify, we are going to consume the service from the same application, which in the real world, does not make sense.</p>
</div>
<div class="paragraph">
<p>Open the existing <code>org.acme.ExampleResource</code> class, and edit the content to become:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">package org.acme;

import io.quarkus.example.GreeterGrpc;
import io.quarkus.example.HelloRequest;
import io.quarkus.grpc.runtime.annotations.GrpcService;

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class ExampleResource {

    @Inject
    @GrpcService("hello")                     <i class="conum" data-value="1"></i><b>(1)</b>
    GreeterGrpc.GreeterBlockingStub client;   <i class="conum" data-value="2"></i><b>(2)</b>

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "hello";
    }

    @GET
    @Path("/{name}")
    public String hello(@PathParam("name") String name) {
        return client.sayHello(HelloRequest.newBuilder().setName(name).build()).getMessage();  <i class="conum" data-value="3"></i><b>(3)</b>
    }
}</code></pre>
</div>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Inject the service and configure its name.This name is used in the application configuration</p>
</li>
<li>
<p>Use the <em>blocking</em> stub (also a generated class)</p>
</li>
<li>
<p>Invoke the service</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>We need to configure the application to indicate where is the <code>hello</code> service.
In the <code>src/main/resources/application.properties</code> file, add the following property:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="text" class="language-text hljs">quarkus.grpc.clients.hello.host=localhost</code></pre>
</div>
</div>
<div class="paragraph">
<p><code>hello</code> is the name of the service used in the <code>@GrpcService</code> annotation
<code>host</code> configures the service host (here it&#8217;s localhost).</p>
</div>
<div class="paragraph">
<p>Then, open <a href="http://localhost:8080/hello/quarkus" class="bare">http://localhost:8080/hello/quarkus</a> in a browser, and you should get <code>Hello quarkus</code>!</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="packaging-the-application"><a class="anchor" href="#packaging-the-application"></a>Packaging the application</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Like any other Quarkus applications, you can package it with: <code>mvn package</code>.
You can also package the application into a native executable with: <code>mvn package -Pnative</code>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="generating-java-files-from-proto-with-protobuf-maven-plugin"><a class="anchor" href="#generating-java-files-from-proto-with-protobuf-maven-plugin"></a>Generating Java files from proto with protobuf-maven-plugin</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Alternatively to using Quarkus code generation to generate stubs for <code>proto</code> files, you can also use
<code>protobuf-maven-plugin</code>.</p>
</div>
<div class="paragraph">
<p>To do it, first define the 2 following properties in the <code>&lt;properties&gt;</code> section:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="xml" class="language-xml hljs">&lt;grpc.version&gt;{grpc-version}&lt;/grpc.version&gt;
&lt;protoc.version&gt;{protoc-version}&lt;/protoc.version&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>They configure the gRPC version and the <code>protoc</code> version.</p>
</div>
<div class="paragraph">
<p>Then, add to the <code>build</code> section the <code>os-maven-plugin</code> extension and the <code>protobuf-maven-plugin</code> configuration.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="xml" class="language-xml hljs">&lt;build&gt;
    &lt;extensions&gt;
        &lt;extension&gt;
            &lt;groupId&gt;kr.motd.maven&lt;/groupId&gt;
            &lt;artifactId&gt;os-maven-plugin&lt;/artifactId&gt;
            &lt;version&gt;${os-maven-plugin-version}&lt;/version&gt;
        &lt;/extension&gt;
    &lt;/extensions&gt;

    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.xolstice.maven.plugins&lt;/groupId&gt;
            &lt;artifactId&gt;protobuf-maven-plugin&lt;/artifactId&gt;      <i class="conum" data-value="1"></i><b>(1)</b>
            &lt;version&gt;${protobuf-maven-plugin-version}&lt;/version&gt;
            &lt;configuration&gt;
                &lt;protocArtifact&gt;com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}&lt;/protocArtifact&gt; <i class="conum" data-value="2"></i><b>(2)</b>
                &lt;pluginId&gt;grpc-java&lt;/pluginId&gt;
                &lt;pluginArtifact&gt;io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}&lt;/pluginArtifact&gt;
                &lt;protocPlugins&gt;
                    &lt;protocPlugin&gt;
                        &lt;id&gt;quarkus-grpc-protoc-plugin&lt;/id&gt;
                        &lt;groupId&gt;io.quarkus&lt;/groupId&gt;
                        &lt;artifactId&gt;quarkus-grpc-protoc-plugin&lt;/artifactId&gt;
                        &lt;version&gt;1.7.0.Final&lt;/version&gt;
                        &lt;mainClass&gt;io.quarkus.grpc.protoc.plugin.MutinyGrpcGenerator&lt;/mainClass&gt;
                    &lt;/protocPlugin&gt;
                &lt;/protocPlugins&gt;
            &lt;/configuration&gt;
            &lt;executions&gt;
                &lt;execution&gt;
                    &lt;id&gt;compile&lt;/id&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;compile&lt;/goal&gt;
                        &lt;goal&gt;compile-custom&lt;/goal&gt;
                    &lt;/goals&gt;
                &lt;/execution&gt;
                &lt;execution&gt;
                    &lt;id&gt;test-compile&lt;/id&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;test-compile&lt;/goal&gt;
                        &lt;goal&gt;test-compile-custom&lt;/goal&gt;
                    &lt;/goals&gt;
                &lt;/execution&gt;
            &lt;/executions&gt;
        &lt;/plugin&gt;

        &lt;!-- ... --&gt;
    &lt;/plugins&gt;
&lt;/build&gt;</code></pre>
</div>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>The <code>protobuf-maven-plugin</code> that generates stub classes from your gRPC service definition (<code>proto</code> files).</p>
</li>
<li>
<p>The class generation uses a tool named <code>protoc</code>, which is OS-specific.
That&#8217;s why we use the <code>os-maven-plugin</code> to target the executable compatible with the operating system.</p>
</li>
</ol>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
This configuration instructs the <code>protobuf-maven-plugin</code> to generate the default gRPC classes and classes using Mutiny to fit with the Quarkus development experience.
</td>
</tr>
</table>
</div>
</div>
</div>
    </div>
  </div>
</div>

  </div>

  <div class="content project-footer">
  <div class="footer-section">
    <div class="logo-wrapper">
      <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_reverse.svg" class="project-logo" title="Quarkus"></a>
    </div>
  </div>
  <div class="grid-wrapper">
    <p class="grid__item width-3-12">Quarkus is open. All dependencies of this project are available under the <a href='https://www.apache.org/licenses/LICENSE-2.0' target='_blank'>Apache Software License 2.0</a> or compatible license.<br /><br />This website was built with <a href='https://jekyllrb.com/' target='_blank'>Jekyll</a>, is hosted on <a href='https://pages.github.com/' target='_blank'>Github Pages</a> and is completely open source. If you want to make it better, <a href='https://github.com/quarkusio/quarkusio.github.io' target='_blank'>fork the website</a> and show us what you’ve got.</p>

    
      <div class="width-1-12 project-links">
        <span>Navigation</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="/">Home</a></li>
          
            <li><a href="/guides">Guides</a></li>
          
            <li><a href="/community/#contributing">Contribute</a></li>
          
            <li><a href="/faq">FAQ</a></li>
          
            <li><a href="/get-started">Get Started</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Contribute</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://twitter.com/quarkusio">Follow us</a></li>
          
            <li><a href="https://github.com/quarkusio">GitHub</a></li>
          
            <li><a href="/security">Security&nbsp;policy</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Get Help</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://groups.google.com/forum/#!forum/quarkus-dev">Forums</a></li>
          
            <li><a href="https://quarkusio.zulipchat.com">Chatroom</a></li>
          
        </ul>
      </div>
    

    
      <div class="width-3-12 more-links">
        <span>Quarkus is made of community projects</span>
        <ul class="footer-links">
          
            <li><a href="https://vertx.io/" target="_blank">Eclipse Vert.x</a></li>
          
            <li><a href="https://microprofile.io" target="_blank">Eclipse MicroProfile</a></li>
          
            <li><a href="https://hibernate.org" target="_blank">Hibernate</a></li>
          
            <li><a href="https://netty.io" target="_blank">Netty</a></li>
          
            <li><a href="https://resteasy.github.io" target="_blank">RESTEasy</a></li>
          
            <li><a href="https://camel.apache.org" target="_blank">Apache Camel</a></li>
          
            <li><a href="https://code.quarkus.io/" target="_blank">And many more...</a></li>
          
        </ul>
      </div>
    
  </div>
</div>
  <div class="content redhat-footer">
  <div class="grid-wrapper">
    <span class="licence">
      <i class="fab fa-creative-commons"></i><i class="fab fa-creative-commons-by"></i> <a href="https://creativecommons.org/licenses/by/3.0/" target="_blank">CC by 3.0</a> | <a href="https://www.redhat.com/en/about/privacy-policy">Privacy Policy</a>
    </span>
    <span class="redhat">
      Sponsored by
    </span>
    <span class="redhat-logo">
      <a href="https://www.redhat.com/" target="_blank"><img src="/assets/images/redhat_reversed.svg"></a>
    </span>
  </div>
</div>


  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js" integrity="sha384-8gBf6Y4YYq7Jx97PIqmTwLPin4hxIzQw5aDmUg/DDhul9fFpbbLcLh3nTIIDJKhx" crossorigin="anonymous"></script>
  <script type="text/javascript" src="/assets/javascript/mobile-nav.js"></script>
  <script type="text/javascript" src="/assets/javascript/scroll-down.js"></script>
  <script src="/assets/javascript/satellite.js" type="text/javascript"></script>
  <script src="https://quarkus.io/guides/javascript/config.js" type="text/javascript"></script>
  <script src="/assets/javascript/search-filter.js" type="text/javascript"></script>
  <script src="/assets/javascript/back-to-top.js" type="text/javascript"></script>
</body>

</html>
